﻿using System;
using System.Collections.Generic;
using System.Linq;
using VO;

namespace DAL
{
    public class HistoricoSorteioDAL
    {

        #region InsereHistoricoSorteio
        public void InsereHistoricoSorteio(HistoricoSorteio obj)
        {
            using (CallcenterEntities data = new CallcenterEntities())
            {
                var tbHistoricoSorteio = new tbCCHistoricoSorteio();

                tbHistoricoSorteio.idCampanha = obj.idCampanha;
                tbHistoricoSorteio.idAtendente = obj.idAtendente;
                tbHistoricoSorteio.idCliente = obj.idCliente;
                tbHistoricoSorteio.dtSorteio = DateTime.Now;

                data.AddTotbCCHistoricoSorteio(tbHistoricoSorteio);
                data.SaveChanges();
            }
        }
        #endregion

        #region selectHistoricoSorteioFiltro
        public IList<HistoricoSorteio> selectHistoricoSorteioFiltro(FiltroHistoricoSorteio obFiltro)
        {
            using (CallcenterEntities data = new CallcenterEntities())
            {
                var consulta = (from tb in data.tbCCHistoricoSorteio
                                where (obFiltro.idCampanha.Contains(tb.idCampanha) || obFiltro.idCampanha.Count.Equals(0))
                                && (obFiltro.idAtendente.Contains(tb.idAtendente) || obFiltro.idAtendente.Count.Equals(0))
                                && (obFiltro.idCliente.Contains(tb.idCliente) || obFiltro.idCliente.Count.Equals(0))
                                && (((obFiltro.dataDe != null && obFiltro.dataAte != null) ?
                                (tb.dtSorteio >= obFiltro.dataDe && tb.dtSorteio <= obFiltro.dataAte) :
                                (obFiltro.dataDe != null) ? tb.dtSorteio >= obFiltro.dataDe : tb.dtSorteio <= obFiltro.dataAte)
                                || (obFiltro.dataDe == null && obFiltro.dataAte == null))
                                select new HistoricoSorteio
                                {
                                    idHistoricoSorteio = tb.idHistoricoSorteio,
                                    idCampanha = tb.idCampanha,
                                    idAtendente = tb.idAtendente,
                                    idCliente = tb.idCliente,
                                    nomeCampanha = tb.tbCCCampanha.nomeCampanha,
                                    nomeCliente = tb.CCCliente_Callcenter.Nome,
                                    nomeAtendente = tb.tbCCAtendente.Nome,
                                    dtSorteio = tb.dtSorteio
                                }).OrderByDescending(c => c.dtSorteio).ToList();

                return consulta;
            }
        }
        #endregion

        #region selectRankingHistoricoSorteioFiltro
        public IList<HistoricoSorteio> selectRankingHistoricoSorteioFiltro(FiltroHistoricoSorteio obFiltro)
        {
            using (CallcenterEntities data = new CallcenterEntities())
            {
                var consulta = (from tb in data.tbCCHistoricoSorteio
                                where (obFiltro.idCampanha.Contains(tb.idCampanha) || obFiltro.idCampanha.Count.Equals(0))
                                && (obFiltro.idAtendente.Contains(tb.idAtendente) || obFiltro.idAtendente.Count.Equals(0))
                                && (obFiltro.idCliente.Contains(tb.idCliente) || obFiltro.idCliente.Count.Equals(0))
                                && (((obFiltro.dataDe != null && obFiltro.dataAte != null) ?
                                (tb.dtSorteio >= obFiltro.dataDe && tb.dtSorteio <= obFiltro.dataAte) :
                                (obFiltro.dataDe != null) ? tb.dtSorteio >= obFiltro.dataDe : tb.dtSorteio <= obFiltro.dataAte)
                                || (obFiltro.dataDe == null && obFiltro.dataAte == null))
                                group tb by new { tb.idCliente, tb.CCCliente_Callcenter.Nome } into g
                                let count = g.Count()
                                orderby count descending
                                select new HistoricoSorteio
                                {
                                    idCliente = g.Key.idCliente,
                                    nomeCliente = g.Key.Nome,
                                    qtdSorteado = count
                                }).ToList();

                return consulta;
            }
        }
        #endregion

        #region selectRankingCampanhaHistoricoSorteioFiltro
        public IList<HistoricoSorteio> selectRankingCampanhaHistoricoSorteioFiltro(FiltroHistoricoSorteio obFiltro)
        {
            using (CallcenterEntities data = new CallcenterEntities())
            {
                var consulta = (from tb in data.tbCCHistoricoSorteio
                                where (obFiltro.idCampanha.Contains(tb.idCampanha) || obFiltro.idCampanha.Count.Equals(0))
                                && (obFiltro.idAtendente.Contains(tb.idAtendente) || obFiltro.idAtendente.Count.Equals(0))
                                && (obFiltro.idCliente.Contains(tb.idCliente) || obFiltro.idCliente.Count.Equals(0))
                                && (((obFiltro.dataDe != null && obFiltro.dataAte != null) ?
                                (tb.dtSorteio >= obFiltro.dataDe && tb.dtSorteio <= obFiltro.dataAte) :
                                (obFiltro.dataDe != null) ? tb.dtSorteio >= obFiltro.dataDe : tb.dtSorteio <= obFiltro.dataAte)
                                || (obFiltro.dataDe == null && obFiltro.dataAte == null))
                                group tb by new { tb.idCliente, tb.idCampanha, tb.CCCliente_Callcenter.Nome, tb.tbCCCampanha.nomeCampanha } into g
                                let count = g.Count()
                                orderby g.Key.nomeCampanha, count descending
                                select new HistoricoSorteio
                                {
                                    idCliente = g.Key.idCliente,
                                    nomeCliente = g.Key.Nome,
                                    idCampanha = g.Key.idCampanha,
                                    nomeCampanha = g.Key.nomeCampanha,
                                    qtdSorteado = count
                                }).ToList();

                return consulta;
            }
        }
        #endregion

        #region SelectHistoricoCampanha
        public IList<Campanha> SelectHistoricoCampanha()
        {
            var contexto = new CallcenterEntities();

            var campanha = (from tb in contexto.tbCCHistoricoSorteio
                            join tb2 in contexto.tbCCCampanha on tb.idCampanha equals tb2.idCampanha
                            select new Campanha { idCampanha = tb2.idCampanha, nomeCampanha = tb2.nomeCampanha }).Distinct().OrderBy(c => c.nomeCampanha).ToList();

            return campanha;
        }
        #endregion

        #region SelectHistoricoAtendente
        public IList<Atendente> SelectHistoricoAtendente()
        {
            var contexto = new CallcenterEntities();

            var atendente = (from tb in contexto.tbCCHistoricoSorteio
                             join tb2 in contexto.tbCCAtendente on tb.idAtendente equals tb2.idAtendente
                             select new Atendente { idAtendente = tb2.idAtendente, NomeAtendente = tb2.Nome }).Distinct().OrderBy(c => c.NomeAtendente).ToList();

            return atendente;
        }
        #endregion

        #region SelectHistoricoCliente
        public IList<Cliente> SelectHistoricoCliente()
        {
            var contexto = new CallcenterEntities();

            var cliente = (from tb in contexto.tbCCHistoricoSorteio
                           join tb2 in contexto.CCCliente_Callcenter on tb.idCliente equals tb2.idCliente
                           select new Cliente { idCliente = tb2.idCliente, nmCliente = tb2.Nome }).Distinct().OrderBy(c => c.nmCliente).ToList();

            return cliente;
        }
        #endregion

    }
}